package mdb.com.vn.web.beans;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import mdb.com.vn.model.LoansSMS;
import mdb.com.vn.services.MDBServices;
import mdb.com.vn.utils.DateUtils;
import mdb.com.vn.utils.TextUtil;
import mdb.com.vn.web.view.LoansSmsDataModel;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

@ManagedBean(name = "loansSmsBean")
@ViewScoped
public class LoansSmsBean implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Date processDate;
	private StreamedContent file;
	private List<LoansSMS> listOfLoansSms;
	private List<Object> listOfobjects;

	private boolean btnVisible;
	private boolean btnSaveVisible;
	
	private LoansSmsDataModel loansSmsDataModel;
	private LoansSMS loansSmsSelected;
	
	private Date lastUpdated;
	private Date nextProcess;

	@ManagedProperty("#{mdbServices}")
	private MDBServices mdbServices;
	
	@PostConstruct
	public void init(){
		listOfLoansSms = new ArrayList<LoansSMS>();
		listOfLoansSms = mdbServices.getLoansSmsByStatus(TextUtil.PROCESSED);
		loansSmsDataModel = new LoansSmsDataModel(listOfLoansSms);
		lastUpdated = mdbServices.getLastUpdatedLoans(TextUtil.LOAN_MODULE);
		nextProcess = DateUtils.workingDayInfuture(lastUpdated, 14);
	}
	public void searchLoansByDate() {
		if (processDate != null) {
			listOfLoansSms = mdbServices.getLoansSmsByAttributes(processDate, TextUtil.PROCESSED);
			loansSmsDataModel = new LoansSmsDataModel(listOfLoansSms);
		} else {
			listOfLoansSms = mdbServices.getLoansSmsByStatus(TextUtil.PROCESSED);
			loansSmsDataModel = new LoansSmsDataModel(listOfLoansSms);
		}
	}
	public void createExcelLoansByPoi() {
		if (processDate != null) {
			listOfobjects = mdbServices.getLoansSmsByPropertiesToExcell(
					TextUtil.PROCESSED, processDate);
		} else {
			listOfobjects = mdbServices
					.getLoansSmsByPropertiesToExcell(TextUtil.PROCESSED);
		}
		Row row = null;
		Cell cell = null;
		try {
			Workbook wb = new HSSFWorkbook();
			HSSFCellStyle styleHeader = (HSSFCellStyle) wb.createCellStyle();
			HSSFFont fontHeader = (HSSFFont) wb.createFont();
			fontHeader.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
			styleHeader.setFont(fontHeader);
			Sheet sheet = wb.createSheet("LOAN SMS");
			row = sheet.createRow((short) 0);
			List<String> columnNames = new ArrayList<String>();

			columnNames.add("Điểm giao dịch");
			columnNames.add("Ngày tạo");
			columnNames.add("Tên khách hàng");
			columnNames.add("Số CIF");
			columnNames.add("Số điện thoại");
			columnNames.add("Số hợp đồng");
			columnNames.add("Số tiền giải ngân");
			columnNames.add("Kỳ hạn (tháng)");
			columnNames.add("Lãi suất");
			columnNames.add("Sản phẩm vay");
			columnNames.add("Dealer");
			columnNames.add("Nhóm khách hàng");
			columnNames.add("Tổng số mã dự thưởng");
			columnNames.add("Mã dự thưởng");
			for (int i = 0; i < columnNames.size(); i++) {
				cell = row.createCell(i);
				cell.setCellValue(columnNames.get(i));
				cell.setCellStyle(styleHeader);
			}
			int j = 1;
			HSSFCellStyle styleRow = (HSSFCellStyle) wb.createCellStyle();
			HSSFFont fontRow = (HSSFFont) wb.createFont();
			fontRow.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
			styleRow.setFont(fontRow);

			for (Object object : listOfobjects) {
				Object[] loanObjTemps = (Object[]) object;
				Object[] loanObj = new Object[] { loanObjTemps[1],
						loanObjTemps[2], loanObjTemps[3], loanObjTemps[4],
						loanObjTemps[5], loanObjTemps[0], loanObjTemps[6],
						loanObjTemps[9], loanObjTemps[7], loanObjTemps[8],
						loanObjTemps[10], loanObjTemps[11], loanObjTemps[12],
						loanObjTemps[13] };
				row = sheet.createRow((short) j);
				for (int k = 0; k < loanObj.length; k++) {
					cell = row.createCell(k);
					cell.setCellValue(loanObj[k] == null ? "N.A" : loanObj[k]
							.toString());
					cell.setCellStyle(styleRow);
				}
				j++;

			}
			String excelFileName = "LOANS_SMS.xls";
			FileOutputStream fos = new FileOutputStream(excelFileName);
			wb.write(fos);
			fos.flush();
			fos.close();
			InputStream stream = new BufferedInputStream(new FileInputStream(
					excelFileName));
			file = new DefaultStreamedContent(stream, "application/xls",
					excelFileName);
			setBtnVisible(true);
			FacesContext
					.getCurrentInstance()
					.addMessage(
							null,
							new FacesMessage(FacesMessage.SEVERITY_INFO,
									"Xử lý xuất dữ liệu thành công",
									"Vui lòng nhấn nút 'Tải về máy' để tại file excell về máy."));
		} catch (Exception e) {
			setBtnVisible(false);
			FacesContext.getCurrentInstance().addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR,
							"Xử lý xuất dữ liệu thất bại",
							"Vui lòng liên hệ quản trị hệ thống."));
		}
	}

	public void downloadPreventedLoans() {
		file = null;
	}
	/**
	 * @return the processDate
	 */
	public Date getProcessDate() {
		return processDate;
	}
	/**
	 * @param processDate the processDate to set
	 */
	public void setProcessDate(Date processDate) {
		this.processDate = processDate;
	}
	/**
	 * @return the listOfLoansSms
	 */
	public List<LoansSMS> getListOfLoansSms() {
		return listOfLoansSms;
	}
	/**
	 * @param listOfLoansSms the listOfLoansSms to set
	 */
	public void setListOfLoansSms(List<LoansSMS> listOfLoansSms) {
		this.listOfLoansSms = listOfLoansSms;
	}
	/**
	 * @return the loansSmsDataModel
	 */
	public LoansSmsDataModel getLoansSmsDataModel() {
		return loansSmsDataModel;
	}
	/**
	 * @param loansSmsDataModel the loansSmsDataModel to set
	 */
	public void setLoansSmsDataModel(LoansSmsDataModel loansSmsDataModel) {
		this.loansSmsDataModel = loansSmsDataModel;
	}
	/**
	 * @return the loansSmsSelected
	 */
	public LoansSMS getLoansSmsSelected() {
		return loansSmsSelected;
	}
	/**
	 * @param loansSmsSelected the loansSmsSelected to set
	 */
	public void setLoansSmsSelected(LoansSMS loansSmsSelected) {
		this.loansSmsSelected = loansSmsSelected;
	}
	/**
	 * @return the file
	 */
	public StreamedContent getFile() {
		return file;
	}
	/**
	 * @param mdbServices the mdbServices to set
	 */
	public void setMdbServices(MDBServices mdbServices) {
		this.mdbServices = mdbServices;
	}
	/**
	 * @return the btnVisible
	 */
	public boolean isBtnVisible() {
		return btnVisible;
	}
	/**
	 * @param btnVisible the btnVisible to set
	 */
	public void setBtnVisible(boolean btnVisible) {
		this.btnVisible = btnVisible;
	}
	/**
	 * @return the btnSaveVisible
	 */
	public boolean isBtnSaveVisible() {
		return btnSaveVisible;
	}
	/**
	 * @param btnSaveVisible the btnSaveVisible to set
	 */
	public void setBtnSaveVisible(boolean btnSaveVisible) {
		this.btnSaveVisible = btnSaveVisible;
	}
	/**
	 * @return the lastUpdated
	 */
	public Date getLastUpdated() {
		return lastUpdated;
	}
	/**
	 * @param lastUpdated the lastUpdated to set
	 */
	public void setLastUpdated(Date lastUpdated) {
		this.lastUpdated = lastUpdated;
	}
	/**
	 * @return the nextProcess
	 */
	public Date getNextProcess() {
		return nextProcess;
	}
	/**
	 * @param nextProcess the nextProcess to set
	 */
	public void setNextProcess(Date nextProcess) {
		this.nextProcess = nextProcess;
	}
	/**
	 * @return the listOfobjects
	 */
	public List<Object> getListOfobjects() {
		return listOfobjects;
	}
	/**
	 * @param listOfobjects the listOfobjects to set
	 */
	public void setListOfobjects(List<Object> listOfobjects) {
		this.listOfobjects = listOfobjects;
	}

}
